Estoy leyendo un libro llamado programación funcional en C# de Enrico Buonanno
public static Validator<T> FailFast<T> (IEnumerable<Validator<T>> validators) => t => validators.Aggregate(Valid(t), (acc, validator) => acc.Bind(_ => validator(t)));El texto original con el código de arriba es:
La estrategia a prueba de fallas es más fácil de implementar: cada validador devuelve una Validación, y la Validación expone una función Vincular que solo aplica la función vinculada si el estado es Válido (al igual que Opción y Cualquiera), por lo que podemos usar Agregado para recorrer la lista de validadores y vincular cada validador al resultado en ejecución.
La función FailFast toma una lista de validadores y devuelve un validador: una función que espera que un objeto de tipo T valide. Al recibir la t válida, recorre la lista de validadores utilizando Valid(t) como acumulador (si la lista de validadores está vacía, entonces t es válida) y aplica cada validador de la lista al acumulador con Bind.
Hay tres signos => . Eso me hace difícil entender bien el código. ¿Alguien que esté familiarizado con el operador => y pueda explicarlo en inglés sencillo? Muchas gracias.
También verifiqué => operador en la documentación. https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/lambda-operator pero la demostración en el documento no es tan complicada como el código anterior.
El => aquí significa cosas diferentes, pero en general cada uno denota una función anónima lambda (con cierre opcional) que se pasa a algún lugar, generalmente como un parámetro en una llamada de función.
Entonces, comience con grandes fragmentos obvios de código como clases y métodos de nivel superior, encuentre mandatos () que indiquen llamadas a funciones, y probablemente será mucho más fácil de entender.
Primero => es una forma abreviada del cuerpo del método (FailFast) para omitir escribir { } en un método pequeño para 'legibilidad' (aquí: dudoso).
Segundo => es una lambda, creada como el valor de retorno de FailFast.
Third => es una lambda, pasada como argumento a Aggregate().
Cuarto => es una lambda, pasada como argumento a Bind().
Agregar algunos paréntesis y agregar corchetes de función de nivel superior para hacerlo más visible:
public static Validator<T> FailFast<T>(IEnumerable<Validator<T>> validators) { return t => validators.Aggregate(Valid(t), ..secondparam..); }y el segundo parámetro es:
(acc, validator) => acc.Bind(...anotherparam...)y otro parámetro es:
_ => validator(t) con t saliendo del ámbito de la lambda a return t=> .